home *** CD-ROM | disk | FTP | other *** search
/ Programming Languages Suite / ProgramD2.iso / Borland / Borland C++ V5.02 / RTLWIN16.PAK / VARIANT.H < prev    next >
C/C++ Source or Header  |  1997-05-06  |  10KB  |  283 lines

  1. /***
  2. *variant.h
  3. *
  4. *Purpose:
  5. *  This file declares VARIANT, and related data types.
  6. *
  7. *Implementation Notes:
  8. *  This file requires ole2.h
  9. *
  10. *****************************************************************************/
  11.  
  12. /* $Copyright: 1994$ */
  13.  
  14. #ifndef _VARIANT_H_
  15. #define _VARIANT_H_
  16. #define __VARIANT_H
  17.  
  18. #ifndef HUGEP
  19. # ifdef _MAC
  20. #  define HUGEP FAR
  21. # else
  22. #  if WIN32
  23. #   define HUGEP
  24. #  else
  25. #   define HUGEP _huge
  26. #  endif
  27. # endif
  28. #endif
  29.  
  30. #ifndef FAR
  31. # ifdef _MAC
  32. #  define FAR
  33. # else
  34. #  ifdef WIN32
  35. #   define FAR
  36. #  else
  37. #   define FAR _far
  38. #  endif
  39. # endif
  40. #endif
  41.  
  42.  
  43. /* Forward Declarations */
  44.  
  45. #ifdef __cplusplus
  46. interface IDispatch;
  47. #else
  48. typedef interface IDispatch IDispatch;
  49. #endif
  50.  
  51.  
  52. #ifndef OLESTR
  53. #if defined(WIN32)
  54. typedef WCHAR OLECHAR;
  55. typedef LPWSTR LPOLESTR;
  56. typedef LPCWSTR LPCOLESTR;
  57. #define OLESTR(str) L##str
  58. #else
  59. typedef char OLECHAR;
  60. typedef OLECHAR FAR* LPOLESTR;
  61. typedef const OLECHAR FAR* LPCOLESTR;
  62. #define OLESTR(str) str
  63. #endif
  64. #endif
  65.  
  66. typedef OLECHAR FAR* BSTR;
  67. typedef BSTR FAR* LPBSTR;
  68.  
  69.  
  70. typedef struct FARSTRUCT tagSAFEARRAYBOUND {
  71.     unsigned long cElements;
  72.     long lLbound;
  73. } SAFEARRAYBOUND, FAR* LPSAFEARRAYBOUND;
  74.  
  75. typedef struct FARSTRUCT tagSAFEARRAY {
  76.     unsigned short cDims;
  77.     unsigned short fFeatures;
  78. #if defined(WIN32)
  79.     unsigned long cbElements;
  80.     unsigned long cLocks;
  81. #else
  82.     unsigned short cbElements;
  83.     unsigned short cLocks;
  84. #ifdef _MAC
  85.     Handle handle;
  86. #else
  87.     unsigned long handle;
  88. #endif
  89. #endif
  90.     void HUGEP* pvData;
  91.     SAFEARRAYBOUND rgsabound[1];
  92. } SAFEARRAY, FAR* LPSAFEARRAY;
  93.  
  94. #define FADF_AUTO       0x0001  /* array is allocated on the stack         */
  95. #define FADF_STATIC     0x0002  /* array is staticly allocated             */
  96. #define FADF_EMBEDDED   0x0004  /* array is embedded in a structure        */
  97. #define FADF_FIXEDSIZE  0x0010  /* array may not be resized or reallocated */
  98. #define FADF_BSTR       0x0100  /* an array of BSTRs                       */
  99. #define FADF_UNKNOWN    0x0200  /* an array of IUnknown*                   */
  100. #define FADF_DISPATCH   0x0400  /* an array of IDispatch*                  */
  101. #define FADF_VARIANT    0x0800  /* an array of VARIANTs                    */
  102. #define FADF_RESERVED   0xF0E8  /* bits reserved for future use            */
  103.  
  104.  
  105. /* 0 == FALSE, -1 == TRUE */
  106. typedef short VARIANT_BOOL;
  107.  
  108.  
  109. typedef double DATE;
  110.  
  111.  
  112. /* This is a helper struct for use in handling currency. */
  113. typedef struct FARSTRUCT tagCY {
  114. #ifdef _MAC
  115.     long          Hi;
  116.     unsigned long Lo;
  117. #else
  118.     unsigned long Lo;
  119.     long          Hi;
  120. #endif
  121. } CY;
  122.  
  123.  
  124. /*
  125.  * VARENUM usage key,
  126.  *
  127.  *   [V] - may appear in a VARIANT
  128.  *   [T] - may appear in a TYPEDESC
  129.  *   [P] - may appear in an OLE property set
  130.  *   [S] - may appear in a Safe Array
  131.  *
  132.  */
  133. enum VARENUM
  134. {
  135.     VT_EMPTY           = 0,   /* [V]   [P]     nothing                     */
  136.     VT_NULL            = 1,   /* [V]           SQL style Null              */
  137.     VT_I2              = 2,   /* [V][T][P][S]  2 byte signed int           */
  138.     VT_I4              = 3,   /* [V][T][P][S]  4 byte signed int           */
  139.     VT_R4              = 4,   /* [V][T][P][S]  4 byte real                 */
  140.     VT_R8              = 5,   /* [V][T][P][S]  8 byte real                 */
  141.     VT_CY              = 6,   /* [V][T][P][S]  currency                    */
  142.     VT_DATE            = 7,   /* [V][T][P][S]  date                        */
  143.     VT_BSTR            = 8,   /* [V][T][P][S]  binary string               */
  144.     VT_DISPATCH        = 9,   /* [V][T]   [S]  IDispatch FAR*              */
  145.     VT_ERROR           = 10,  /* [V][T]   [S]  SCODE                       */
  146.     VT_BOOL            = 11,  /* [V][T][P][S]  True=-1, False=0            */
  147.     VT_VARIANT         = 12,  /* [V][T][P][S]  VARIANT FAR*                */
  148.     VT_UNKNOWN         = 13,  /* [V][T]   [S]  IUnknown FAR*               */
  149.  
  150.     VT_I1              = 16,  /*    [T]        signed char                 */
  151.     VT_UI1             = 17,  /* [V][T]   [S]  unsigned char               */
  152.     VT_UI2             = 18,  /*    [T]        unsigned short              */
  153.     VT_UI4             = 19,  /*    [T]        unsigned short              */
  154.     VT_I8              = 20,  /*    [T][P]     signed 64-bit int           */
  155.     VT_UI8             = 21,  /*    [T]        unsigned 64-bit int         */
  156.     VT_INT             = 22,  /*    [T]        signed machine int          */
  157.     VT_UINT            = 23,  /*    [T]        unsigned machine int        */
  158.     VT_VOID            = 24,  /*    [T]        C style void                */
  159.     VT_HRESULT         = 25,  /*    [T]                                    */
  160.     VT_PTR             = 26,  /*    [T]        pointer type                */
  161.     VT_SAFEARRAY       = 27,  /*    [T]        (use VT_ARRAY in VARIANT)   */
  162.     VT_CARRAY          = 28,  /*    [T]        C style array               */
  163.     VT_USERDEFINED     = 29,  /*    [T]        user defined type           */
  164.     VT_LPSTR           = 30,  /*    [T][P]     null terminated string      */
  165.     VT_LPWSTR          = 31,  /*    [T][P]     wide null terminated string */
  166.  
  167.     VT_FILETIME        = 64,  /*       [P]     FILETIME                    */
  168.     VT_BLOB            = 65,  /*       [P]     Length prefixed bytes       */
  169.     VT_STREAM          = 66,  /*       [P]     Name of the stream follows  */
  170.     VT_STORAGE         = 67,  /*       [P]     Name of the storage follows */
  171.     VT_STREAMED_OBJECT = 68,  /*       [P]     Stream contains an object   */
  172.     VT_STORED_OBJECT   = 69,  /*       [P]     Storage contains an object  */
  173.     VT_BLOB_OBJECT     = 70,  /*       [P]     Blob contains an object     */
  174.     VT_CF              = 71,  /*       [P]     Clipboard format            */
  175.     VT_CLSID           = 72   /*       [P]     A Class ID                  */
  176. };
  177.  
  178. #define VT_VECTOR      0x1000 /*       [P]     simple counted array        */
  179. #define VT_ARRAY       0x2000 /* [V]           SAFEARRAY*                  */
  180. #define VT_BYREF       0x4000 /* [V]                                       */
  181. #define VT_RESERVED    0x8000
  182.  
  183.  
  184. typedef unsigned short VARTYPE;
  185.  
  186. typedef struct FARSTRUCT tagVARIANT VARIANT;
  187. typedef struct FARSTRUCT tagVARIANT FAR* LPVARIANT;
  188. typedef struct FARSTRUCT tagVARIANT VARIANTARG;
  189. typedef struct FARSTRUCT tagVARIANT FAR* LPVARIANTARG;
  190.  
  191. struct FARSTRUCT tagVARIANT{
  192.     VARTYPE vt;
  193.     unsigned short wReserved1;
  194.     unsigned short wReserved2;
  195.     unsigned short wReserved3;
  196.     union {
  197.       unsigned char bVal;            /* VT_UI1               */
  198.       short        iVal;             /* VT_I2                */
  199.       long         lVal;             /* VT_I4                */
  200.       float        fltVal;           /* VT_R4                */
  201.       double       dblVal;           /* VT_R8                */
  202. #if defined(__cplusplus) && defined(__BORLANDC__)
  203.       VARIANT_BOOL boolVal;          /* VT_BOOL              */
  204. #else
  205.       VARIANT_BOOL bool;             /* VT_BOOL              */
  206. #endif
  207.       SCODE        scode;            /* VT_ERROR             */
  208.       CY           cyVal;            /* VT_CY                */
  209.       DATE         date;             /* VT_DATE              */
  210.       BSTR         bstrVal;          /* VT_BSTR              */
  211.       IUnknown     FAR* punkVal;     /* VT_UNKNOWN           */
  212.       IDispatch    FAR* pdispVal;    /* VT_DISPATCH          */
  213.       SAFEARRAY    FAR* parray;      /* VT_ARRAY|*           */
  214.  
  215.       unsigned char FAR *pbVal;      /* VT_BYREF|VT_UI1      */
  216.       short        FAR* piVal;       /* VT_BYREF|VT_I2       */
  217.       long         FAR* plVal;       /* VT_BYREF|VT_I4       */
  218.       float        FAR* pfltVal;     /* VT_BYREF|VT_R4       */
  219.       double       FAR* pdblVal;     /* VT_BYREF|VT_R8       */
  220.       VARIANT_BOOL FAR* pbool;       /* VT_BYREF|VT_BOOL     */
  221.       SCODE        FAR* pscode;      /* VT_BYREF|VT_ERROR    */
  222.       CY           FAR* pcyVal;      /* VT_BYREF|VT_CY       */
  223.       DATE         FAR* pdate;       /* VT_BYREF|VT_DATE     */
  224.       BSTR         FAR* pbstrVal;    /* VT_BYREF|VT_BSTR     */
  225.       IUnknown  FAR* FAR* ppunkVal;  /* VT_BYREF|VT_UNKNOWN  */
  226.       IDispatch FAR* FAR* ppdispVal; /* VT_BYREF|VT_DISPATCH */
  227.       SAFEARRAY FAR* FAR* pparray;   /* VT_BYREF|VT_ARRAY|*  */
  228.       VARIANT      FAR* pvarVal;     /* VT_BYREF|VT_VARIANT  */
  229.  
  230.       void         FAR* byref;       /* Generic ByRef        */
  231.     } _UNION_NAME(u);
  232. };
  233.  
  234. #if defined(NONAMELESSUNION) || (defined(_MAC) && !defined(__cplusplus) && !defined(_MSC_VER))
  235. # define V_UNION(X, Y) ((X)->u.Y)
  236. #else
  237. # define V_UNION(X, Y) ((X)->Y)
  238. #endif
  239.  
  240. /* Variant access macros */
  241. #define V_VT(X)          ((X)->vt)
  242. #define V_ISBYREF(X)     (V_VT(X)&VT_BYREF)
  243. #define V_ISARRAY(X)     (V_VT(X)&VT_ARRAY)
  244. #define V_ISVECTOR(X)    (V_VT(X)&VT_VECTOR)
  245.  
  246. #define V_NONE(X)        V_I2(X)
  247. #define V_UI1(X)         V_UNION(X, bVal)
  248. #define V_UI1REF(X)      V_UNION(X, pbVal)
  249. #define V_I2(X)          V_UNION(X, iVal)
  250. #define V_I2REF(X)       V_UNION(X, piVal)
  251. #define V_I4(X)          V_UNION(X, lVal)
  252. #define V_I4REF(X)       V_UNION(X, plVal)
  253. #define V_R4(X)          V_UNION(X, fltVal)
  254. #define V_R4REF(X)       V_UNION(X, pfltVal)
  255. #define V_R8(X)          V_UNION(X, dblVal)
  256. #define V_R8REF(X)       V_UNION(X, pdblVal)
  257.  
  258. #if defined(__cplusplus) && defined(__BORLANDC__)
  259.         #define V_BOOL(X)        V_UNION(X, boolVal)
  260. #else
  261.         #define V_BOOL(X)        V_UNION(X, bool)
  262. #endif
  263.  
  264. #define V_BOOLREF(X)     V_UNION(X, pbool)
  265. #define V_ERROR(X)       V_UNION(X, scode)
  266. #define V_ERRORREF(X)    V_UNION(X, pscode)
  267. #define V_CY(X)          V_UNION(X, cyVal)
  268. #define V_CYREF(X)       V_UNION(X, pcyVal)
  269. #define V_DATE(X)        V_UNION(X, date)
  270. #define V_DATEREF(X)     V_UNION(X, pdate)
  271. #define V_BSTR(X)        V_UNION(X, bstrVal)
  272. #define V_BSTRREF(X)     V_UNION(X, pbstrVal)
  273. #define V_UNKNOWN(X)     V_UNION(X, punkVal)
  274. #define V_UNKNOWNREF(X)  V_UNION(X, ppunkVal)
  275. #define V_DISPATCH(X)    V_UNION(X, pdispVal)
  276. #define V_DISPATCHREF(X) V_UNION(X, ppdispVal)
  277. #define V_VARIANTREF(X)  V_UNION(X, pvarVal)
  278. #define V_ARRAY(X)       V_UNION(X, parray)
  279. #define V_ARRAYREF(X)    V_UNION(X, pparray)
  280. #define V_BYREF(X)       V_UNION(X, byref)
  281.  
  282. #endif /* _VARIANT_H_ */
  283.